// 直接DFS就行，搜索到已经搜过的点就是一个环，判断一下不要往回走就行
#include <bits/stdc++.h>
using namespace std;
const int N = 55;
int n, m;
char g[N][N];
bool st[N][N]; //
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
bool dfs(int x, int y, int from)
{
	st[x][y] = true;
	for (int i = 0; i < 4; i++)
	{
		if ((i ^ 2) == from)
			continue; // 不能往回走，通过异或操作检查当前方向i是否与from相反。如果相同，则^ 2的结果为0，否则为1。
		int a = x + dx[i], b = y + dy[i];
		if (a < 0 || a >= n || b < 0 || b >= m||g[a][b]!=g[x][y])//
			continue;
		if (st[a][b])//如果新坐标(a, b)已经被访问过，说明找到了一个环，直接返回true
			return true;
		if (dfs(a, b, i))//递归调用DFS，尝试沿着当前方向i继续搜索。如果找到符合条件的路径，返回true。
			return true;
	}
	return false;
}
int main()
{
	cin >> n >> m;
	for (int i = 0; i < n; i++)
	{
		cin >> g[i];
	}
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			if (!st[i][j])
				if (dfs(i, j, -1))
				{
					puts("Yes");
					return 0;
				}
	puts("No");
	return 0;
}
